/**
 * ==================== 全局状态管理 Store（demo 预览图片列表） ====================
 * 使用 Composition API（组合式） 风格
 */
import { defineStore } from 'pinia';
import { ref, computed } from 'vue'; // 必须导入 ref 和 computed

// 定义列表中单个项的类型接口，确保类型安全
interface ListItem {
    classid: string;
    description: string;
    nickname: string,
    score: string,
    smallPicurl: string,
    tabs: string[],
    userScore?: string,
    _id: string
}

export const useClassListStore = defineStore(
    'classList',
    () => {
        /// State: 使用 ref 定义响应式状态
        // 初始化为空数组
        const list = ref<ListItem[]>([]);

        /// Getters: 使用 computed 定义计算属性
        // 获取列表长度
        const listCount = computed(() => list.value.length);

        // 获取前 N 项
        const getFirstNItems = (n: number): ListItem[] => {
            return list.value.slice(0, n);
        };

        // 根据 ID 查找项目
        const getItemById = (id: number | string): ListItem | undefined => {
            return list.value.find(item => item._id === id);
        };

        // 根据 ID 查找项目的索引
        const getItemIndexById = (id: number | string): number => {
            return list.value.findIndex(item => item._id === id);
        };

        // 根据 索引 查找项目
        const getItemByIndex = (index: number): ListItem | undefined => {
            return list.value[index];
        };

        // 获取所有列表数据
        const getAllItems = (): ListItem[] => {
            return list.value; // 直接返回列表数据
        };

        /// Actions: 定义普通函数来修改状态
        // 设置整个列表
        const setList = (newList: ListItem[]): void => {
            list.value = newList;
        };

        // 添加一项到列表末尾
        const addItem = (item: ListItem): void => {
            list.value.push(item);
        };

        // 根据索引移除一项
        const removeItem = (index: number): void => {
            if (index >= 0 && index < list.value.length) {
                list.value.splice(index, 1);
            }
        };

        // 根据 ID 移除一项
        const removeItemById = (id: number | string): void => {
            const index = list.value.findIndex(item => item._id === id);
            if (index !== -1) {
                list.value.splice(index, 1);
            }
        };

        // 更新指定项
        const updateItem = (updatedItem: ListItem): void => {
            const index = list.value.findIndex(item => item._id === updatedItem._id);
            if (index !== -1) {
                list.value[index] = { ...list.value[index], ...updatedItem };
            }
        };

        // 清空列表
        const clearList = (): void => {
            list.value = [];
        };

        /// 必须返回所有要暴露的状态、getters 和 actions
        return {
            list,
            listCount,
            getFirstNItems,
            getItemById,
            getItemIndexById,
            getItemByIndex,
            getAllItems,
            setList,
            addItem,
            removeItem,
            removeItemById,
            updateItem,
            clearList,
        };
    },

    /// 持久化配置
    {
        persist: {
            enabled: true,
            strategies: [
                {
                    key: 'clsss-list', // 存储在 localStorage 中的键名
                    storage: localStorage, // 使用 localStorage
                    // 可以选择只持久化部分状态，减少存储空间
                    // paths: ['classList'] // 默认会持久化所有 state
                }
            ]
        }
    },
);